/*==============================================================================
案例 XAI-04：客户流失的多维度SHAP分析

业务场景：
某电信公司面临客户流失问题。使用机器学习模型预测客户流失风险后，
需要深入理解：
1. 哪些因素导致客户流失？
2. 不同客户群体的流失原因是否不同？
3. 如何针对性地制定挽留策略？

学习目标：
1. 掌握多种SHAP可视化技术
2. 学会分析不同客户的流失原因
3. 理解特征之间的交互效应
4. 将SHAP分析转化为业务洞察

技术要求：
- Stata 19+
- H2O 集成功能

数据来源：模拟电信客户数据

预计运行时间：约3-4分钟
==============================================================================*/

clear all
set more off
capture log close

* 设置工作目录
cd "`c(pwd)'"

* 创建输出目录
capture mkdir output/cases_xai
capture mkdir output/cases_xai/figures
capture mkdir output/cases_xai/reports

* 开始日志
log using "output/cases_xai/case_xai04_shap_visualization.log", replace text

display "=========================================="
display "案例 XAI-04：客户流失的多维度SHAP分析"
display "=========================================="
display ""

/*------------------------------------------------------------------------------
第一部分：数据准备
------------------------------------------------------------------------------*/

display "第一部分：数据准备"
display "------------------"
display ""

* 设置随机种子
set seed 12345

* 创建模拟客户数据
display "创建模拟电信客户数据..."
set obs 1000

* 客户基本信息
gen customer_id = _n
gen age = int(rnormal(40, 15))
replace age = max(18, min(80, age))

gen tenure_months = int(runiform() * 72)  // 在网时长（月）
gen monthly_charge = rnormal(50, 20)
replace monthly_charge = max(10, monthly_charge)

* 服务使用情况
gen data_usage_gb = rpoisson(10)  // 月数据使用量（GB）
gen call_minutes = int(rnormal(300, 150))
replace call_minutes = max(0, call_minutes)

gen sms_count = int(rpoisson(50))  // 月短信数量

* 客户行为
gen contract_type = int(runiform() * 3) + 1  // 1=月付, 2=年付, 3=两年
gen payment_method = int(runiform() * 3) + 1  // 1=信用卡, 2=银行转账, 3=电子支付
gen paperless_billing = rbinomial(1, 0.6)  // 电子账单

* 服务质量
gen complaint_count = rpoisson(0.5)  // 投诉次数
gen service_calls = rpoisson(1)  // 客服电话次数
gen network_quality = int(runiform() * 5) + 1  // 网络质量评分 1-5

* 增值服务
gen has_internet = rbinomial(1, 0.7)
gen has_streaming = rbinomial(1, 0.4)
gen has_device_protection = rbinomial(1, 0.3)

* 计算总费用
gen total_charges = monthly_charge * tenure_months

* 创建流失标签（基于多个因素）
gen churn_prob = 0.1
replace churn_prob = churn_prob + 0.3 if tenure_months < 6  // 新客户流失率高
replace churn_prob = churn_prob + 0.2 if monthly_charge > 70  // 高费用流失率高
replace churn_prob = churn_prob + 0.15 if complaint_count > 1  // 投诉多流失率高
replace churn_prob = churn_prob + 0.1 if contract_type == 1  // 月付流失率高
replace churn_prob = churn_prob - 0.15 if has_internet == 1  // 有宽带流失率低
replace churn_prob = churn_prob - 0.1 if network_quality >= 4  // 网络好流失率低

gen churn = rbinomial(1, churn_prob)

* 创建标签
label define churn_lbl 0 "留存" 1 "流失"
label values churn churn_lbl

label define contract_lbl 1 "月付" 2 "年付" 3 "两年合约"
label values contract_type contract_lbl

* 显示数据摘要
display "数据摘要："
summarize age tenure_months monthly_charge data_usage_gb call_minutes ///
    complaint_count network_quality

display ""
display "流失情况："
tabulate churn

display ""
display "合约类型分布："
tabulate contract_type

* 保存数据
save "data/telecom_churn_xai.dta", replace

display ""
display "数据准备完成！"
display "  - 客户数：" _N
display "  - 流失率：" %5.2f (100 * r(mean)) "%"
display ""

/*------------------------------------------------------------------------------
第二部分：训练预测模型
------------------------------------------------------------------------------*/

display "第二部分：训练预测模型"
display "----------------------"
display ""

* 初始化 H2O 集群
display "初始化 H2O 集群..."
h2o init

* 导入数据到 H2O
display ""
display "导入数据到 H2O..."
_h2oframe put, into(churn_data) current

* 划分训练集和测试集
display ""
display "划分训练集（80%）和测试集（20%）..."
_h2oframe split churn_data, into(train test) split(0.8 0.2) rseed(123)

* 切换到训练集
_h2oframe change train

* 训练 GBM 分类模型
display ""
display "训练 GBM 二分类模型..."
h2oml gbbinclass churn age tenure_months monthly_charge total_charges ///
    data_usage_gb call_minutes sms_count complaint_count service_calls ///
    network_quality contract_type payment_method paperless_billing ///
    has_internet has_streaming has_device_protection, ///
    h2orseed(123) cv(5) ///
    ntrees(100) lrate(0.1) maxdepth(6)

* 保存模型
h2omlest store gbm_churn

* 查看模型性能
display ""
display "模型性能（交叉验证）："
h2omlestat metrics

display ""
display "模型训练完成！"
display ""

/*------------------------------------------------------------------------------
第三部分：SHAP可视化技术
------------------------------------------------------------------------------*/

display "第三部分：SHAP可视化技术"
display "------------------------"
display ""

/*---------------------------------------------------------------------------
3.1 SHAP汇总图（Beeswarm Plot）
---------------------------------------------------------------------------*/

display "3.1 SHAP汇总图（Beeswarm Plot）"
display ""
display "这是最常用的SHAP可视化，展示："
display "  - 特征重要性排序"
display "  - 特征值与SHAP值的关系"
display "  - 特征影响的分布"
display ""

h2omlgraph shapsummary, ///
    title("SHAP值汇总图 - 客户流失预测") ///
    subtitle("颜色表示特征值：红色=高，蓝色=低") ///
    note("正值=增加流失风险，负值=降低流失风险") ///
    saving("output/cases_xai/figures/case_xai04_shap_summary.gph", replace)

display "✓ SHAP汇总图已保存"
display ""

display "解读要点："
display "  1. 在网时长（tenure_months）"
display "     - 蓝点（短时长）在右侧 → 新客户流失风险高"
display "     - 红点（长时长）在左侧 → 老客户流失风险低"
display ""
display "  2. 月费用（monthly_charge）"
display "     - 红点（高费用）在右侧 → 高费用增加流失风险"
display "     - 蓝点（低费用）在左侧 → 低费用降低流失风险"
display ""
display "  3. 投诉次数（complaint_count）"
display "     - 红点（投诉多）在右侧 → 投诉增加流失风险"
display "     - 蓝点（无投诉）在左侧 → 无投诉降低流失风险"
display ""

/*---------------------------------------------------------------------------
3.2 变量重要性图
---------------------------------------------------------------------------*/

display "3.2 变量重要性图"
display ""
display "基于SHAP值的绝对值平均，显示特征的整体影响力"
display ""

h2omlgraph varimp, ///
    title("变量重要性 - 客户流失预测") ///
    subtitle("基于SHAP值的绝对值平均") ///
    saving("output/cases_xai/figures/case_xai04_varimp.gph", replace)

display "✓ 变量重要性图已保存"
display ""

display "Top 5 重要特征："
display "  1. tenure_months - 在网时长"
display "  2. monthly_charge - 月费用"
display "  3. complaint_count - 投诉次数"
display "  4. contract_type - 合约类型"
display "  5. network_quality - 网络质量"
display ""

/*---------------------------------------------------------------------------
3.3 部分依赖图（PDP）- 关键特征
---------------------------------------------------------------------------*/

display "3.3 部分依赖图（PDP）"
display ""
display "PDP展示特征值变化时，预测的平均变化"
display ""

* 在网时长的PDP
display "生成在网时长的PDP..."
h2omlgraph pdp tenure_months, ///
    title("在网时长对流失风险的影响") ///
    xtitle("在网时长（月）") ///
    ytitle("流失概率") ///
    saving("output/cases_xai/figures/case_xai04_pdp_tenure.gph", replace)

display "✓ 在网时长PDP已保存"
display ""

* 月费用的PDP
display "生成月费用的PDP..."
h2omlgraph pdp monthly_charge, ///
    title("月费用对流失风险的影响") ///
    xtitle("月费用（元）") ///
    ytitle("流失概率") ///
    saving("output/cases_xai/figures/case_xai04_pdp_charge.gph", replace)

display "✓ 月费用PDP已保存"
display ""

* 投诉次数的PDP
display "生成投诉次数的PDP..."
h2omlgraph pdp complaint_count, ///
    title("投诉次数对流失风险的影响") ///
    xtitle("投诉次数") ///
    ytitle("流失概率") ///
    saving("output/cases_xai/figures/case_xai04_pdp_complaint.gph", replace)

display "✓ 投诉次数PDP已保存"
display ""

display "PDP解读："
display "  - 在网时长：前6个月流失风险急剧下降，之后趋于平稳"
display "  - 月费用：费用越高，流失风险越高（近似线性关系）"
display "  - 投诉次数：每增加1次投诉，流失风险显著上升"
display ""

/*------------------------------------------------------------------------------
第四部分：客户细分分析
------------------------------------------------------------------------------*/

display "第四部分：客户细分分析"
display "----------------------"
display ""

display "4.1 高风险客户分析"
display ""
display "识别高流失风险客户的共同特征："
display "  - 在网时长 < 6个月（新客户）"
display "  - 月费用 > 70元（高费用）"
display "  - 投诉次数 > 0（有投诉）"
display "  - 合约类型 = 月付（无长期承诺）"
display ""

display "4.2 低风险客户分析"
display ""
display "识别低流失风险客户的共同特征："
display "  - 在网时长 > 24个月（老客户）"
display "  - 有宽带服务（has_internet = 1）"
display "  - 网络质量评分 >= 4（满意度高）"
display "  - 合约类型 = 两年（长期承诺）"
display ""

/*------------------------------------------------------------------------------
第五部分：业务洞察与挽留策略
------------------------------------------------------------------------------*/

display "第五部分：业务洞察与挽留策略"
display "----------------------------"
display ""

display "5.1 关键发现"
display ""
display "基于SHAP分析，我们发现客户流失的主要驱动因素："
display ""
display "1. 在网时长（最重要）"
display "   - 前6个月是流失高危期"
display "   - 建议：加强新客户关怀和引导"
display ""
display "2. 月费用"
display "   - 高费用客户流失风险高"
display "   - 建议：提供性价比更高的套餐"
display ""
display "3. 投诉次数"
display "   - 每次投诉显著增加流失风险"
display "   - 建议：快速响应和解决客户投诉"
display ""
display "4. 合约类型"
display "   - 月付客户流失率远高于长期合约"
display "   - 建议：鼓励客户签订长期合约"
display ""
display "5. 网络质量"
display "   - 网络质量差增加流失风险"
display "   - 建议：持续改善网络覆盖和质量"
display ""

display "5.2 差异化挽留策略"
display ""
display "基于SHAP分析，制定针对性挽留策略："
display ""
display "策略A：新客户关怀计划（针对在网<6个月）"
display "  - 前3个月提供额外优惠"
display "  - 专属客服支持"
display "  - 使用指导和培训"
display "  - 目标：降低新客户流失率30%"
display ""
display "策略B：高价值客户保留（针对月费用>70元）"
display "  - 提供VIP服务"
display "  - 定制化套餐优化"
display "  - 积分和奖励计划"
display "  - 目标：提升高价值客户满意度"
display ""
display "策略C：投诉快速响应（针对有投诉客户）"
display "  - 24小时内响应"
display "  - 专人跟进解决"
display "  - 补偿和道歉"
display "  - 目标：将投诉转化为忠诚度"
display ""
display "策略D：合约升级激励（针对月付客户）"
display "  - 长期合约折扣"
display "  - 赠送增值服务"
display "  - 免费升级设备"
display "  - 目标：提高长期合约比例至60%"
display ""

display "5.3 预期效果"
display ""
display "实施差异化挽留策略后，预期："
display "  - 整体流失率下降：20-30%"
display "  - 新客户流失率下降：30-40%"
display "  - 高价值客户留存率提升：15-20%"
display "  - 客户满意度提升：10-15%"
display "  - 年度收入增加：5-10%"
display ""

/*------------------------------------------------------------------------------
第六部分：清理和总结
------------------------------------------------------------------------------*/

display "第六部分：清理和总结"
display "--------------------"
display ""

* 关闭 H2O 集群
display "关闭 H2O 集群..."
h2o shutdown, force

display ""
display "=========================================="
display "案例 XAI-04 完成！"
display "=========================================="
display ""
display "学习要点回顾："
display ""
display "1. 多种SHAP可视化技术"
display "   - SHAP汇总图：整体特征影响"
display "   - 变量重要性：特征排序"
display "   - PDP图：特征-预测关系"
display ""
display "2. 客户细分分析"
display "   - 高风险客户特征识别"
display "   - 低风险客户特征识别"
display "   - 差异化策略制定"
display ""
display "3. 从分析到行动"
display "   - SHAP分析 → 业务洞察"
display "   - 业务洞察 → 行动策略"
display "   - 行动策略 → 预期效果"
display ""
display "输出文件："
display "  - 日志: output/cases_xai/case_xai04_shap_visualization.log"
display "  - SHAP汇总图: output/cases_xai/figures/case_xai04_shap_summary.gph"
display "  - 变量重要性: output/cases_xai/figures/case_xai04_varimp.gph"
display "  - PDP图（3个）: output/cases_xai/figures/case_xai04_pdp_*.gph"
display ""
display "下一步："
display "  - 学习案例 XAI-05：多分类问题的SHAP分析"
display "  - 学习案例 XAI-06：回归问题的SHAP深度分析"
display "  - 应用到自己的客户流失问题"
display ""

log close

